package com.biboheart.adapter.support.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeUtils {
    /**
     * 格式化输出时间
     * @param format 格式化字符串
     * @param date Date对象
     * @return 格式化后的时间
     */
    public static String formatDate(Date date, String format) {
        if (null == format || "".equals(format)) {
            format = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        if (null == date) {
            return sdf.format(new Date());
        }
        return sdf.format(date);
    }

    /**
     * 格式化输出时间（时间戳）
     * @param format 格式化字符串
     * @param millisecond 时间戳
     * @return 格式化后的时间
     */
    public static String formatDateMillis(long millisecond, String format) {
        if (null == format || "".equals(format)) {
            format = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(millisecond);
    }

    /**
     * 取指定日期的时间戳
     * @param dateString 日期字符串
     * @param pattern 日期字符串格式，默认"yyyy-MM-dd HH:mm:ss"
     * @return 时间戳
     */
    public static long getDateMillis(String dateString, String pattern) {
        if (null == pattern || pattern.isEmpty()) {
            pattern = "yyyy-MM-dd HH:mm:ss";
        }
        Date date = null;
        try {
            date = new SimpleDateFormat(pattern).parse(dateString);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null == date ? 0 : date.getTime();
    }

    /**
     * 取基准时间多少天后的0点的时间戳
     * @param criterion 基准时间，如果为不大于0，取当前时间
     * @param days 多少天后，如果为负数，则为多少天前，如果为0，则为当天
     * @return 时间戳
     */
    public static long getDaysMillis(long criterion, int days) {
        if (criterion <= 0) {
            criterion = System.currentTimeMillis();
        }
        criterion = criterion + 28800000L;
        return criterion - (criterion % 86400000L) + (days * 86400000L) - 28800000L;
    }

    /**
     * 取多少个月后的时间戳
     * @param criterion 基准时间，如果为不大于0，取当前时间
     * @param months 多少月后，如果为负数，则为多少月前，如果为0，则为当前时间
     * @return 时间戳
     */
    public static long getMonthsMillis(long criterion, int months) {
        if (criterion <= 0) {
            criterion = System.currentTimeMillis();
        }
        String criterionStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(criterion);
        String[] masterArray = criterionStr.split(" ");
        String[] dateArray = masterArray[0].split("-");
        int y = Integer.parseInt(dateArray[0]);
        int m = Integer.parseInt(dateArray[1]);
        int d = Integer.parseInt(dateArray[2]);
        m += months;
        if (m > 12) {
            y += m / 12;
            m = m % 12;
        } else if (m < 0) {
            y -= Math.abs(m) / 12 + 1;
            m = 12 - Math.abs(m) % 12;
        }
        StringBuilder builder = new StringBuilder();
        builder.append(y).append("-");
        if (m < 10) {
            builder.append("0");
        }
        builder.append(m).append("-").append(d).append(" ").append("00:00:00");
        return getDateMillis(builder.toString(), null);
    }

    /**
     * 取多少个月后第一天的0点的时间戳
     * @param criterion 基准时间，如果为不大于0，取当前时间
     * @param months 多少月后，如果为负数，则为多少月前，如果为0，则为当前时间
     * @return 时间戳
     */
    public static long getMonthsFirstDayMillis(long criterion, int months) {
        if (criterion <= 0) {
            criterion = System.currentTimeMillis();
        }
        String criterionStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(criterion);
        String[] masterArray = criterionStr.split(" ");
        String[] dateArray = masterArray[0].split("-");
        int y = Integer.parseInt(dateArray[0]);
        int m = Integer.parseInt(dateArray[1]);
        m += months;
        if (m > 12) {
            y += m / 12;
            m = m % 12;
        } else if (m < 0) {
            y -= Math.abs(m) / 12 + 1;
            m = 12 - Math.abs(m) % 12;
        }
        StringBuilder builder = new StringBuilder();
        builder.append(y).append("-");
        if (m < 10) {
            builder.append("0");
        }
        builder.append(m).append("-").append("01").append(" ").append("00:00:00");
        return getDateMillis(builder.toString(), null);
    }

    /**
     * 取多少年后的时间戳
     * @param criterion 基准时间，如果为不大于0，取当前时间
     * @param years 多少年后，如果为负数，则为多少年前，如果为0，则为当前时间
     * @return 时间戳
     */
    public static long getYearsMillis(long criterion, int years) {
        if (criterion <= 0) {
            criterion = System.currentTimeMillis();
        }
        String criterionStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(criterion);
        String[] masterArray = criterionStr.split(" ");
        String[] dateArray = masterArray[0].split("-");
        int y = Integer.parseInt(dateArray[0]);
        y += years;
        String builder = y + "-" + dateArray[1] + "-" + dateArray[2] + " 00:00:00";
        return getDateMillis(builder, null);
    }

    /**
     * 取多少个年后第一天的0点的时间戳
     * @param criterion 基准时间，如果为不大于0，取当前时间
     * @param years 多少年后，如果为负数，则为多少月前，如果为0，则为当前时间
     * @return 时间戳
     */
    public static long getYearsFirstDayMillis(long criterion, int years) {
        if (criterion <= 0) {
            criterion = System.currentTimeMillis();
        }
        String criterionStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(criterion);
        String[] masterArray = criterionStr.split(" ");
        String[] dateArray = masterArray[0].split("-");
        int y = Integer.parseInt(dateArray[0]);
        y += years;
        String builder = y + "-01-01 00:00:00";
        return getDateMillis(builder, null);
    }

    /**
     * 取时间差，与目标时间的时间差
     * @param source 原时间，时间戳
     * @param target 目标时间，时间戳
     * @param showSecond 是否显示秒
     * @return 时间差
     */
    public static String getTimeInterval(long source, long target, boolean showSecond) {
        if (0 >= source || 0 >= target) {
            return "";
        }
        StringBuilder buf = new StringBuilder();
        long time = Math.abs(source - target);
        // day
        long day = time / (24 * 60 * 60 * 1000L);
        // hour
        time = time - day * 24 * 60 * 60 * 1000L;
        long hour = time / (60 * 60 * 1000L);
        // minute
        time = time - hour * 60 * 60 * 1000L;
        long minute = time / (60 * 1000L);
        // second
        time = time - minute * 60 * 1000L;
        long second = time / 1000L;
        if (day != 0) {
            buf.append(day).append("天");
        }
        if (hour != 0) {
            buf.append(hour).append("时");
        }
        if (minute != 0) {
            buf.append(minute).append("分");
        }
        if ((showSecond || buf.length() == 0) && second != 0) {
            buf.append(second).append("秒");
        }
        return buf.toString();
    }
}
